/**
 * @file 协议处理工具
 * @description 提供协议注册检查和处理功能
 * @author 黄敏
 * @version 1.0.0
 * @since 2025-08-12
 */

import { exec } from 'node:child_process'
import { platform } from 'node:os'

/**
 * 检查协议是否已注册
 * @param protocol - 要检查的协议名称（不包含冒号）
 * @returns Promise<boolean> - 协议是否已注册
 * @example
 * ```ts
 * const isRegistered = await isProtocolRegistered('mailto')
 * console.log(isRegistered) // true 或 false
 * ```
 */
export async function isProtocolRegistered(protocol: string): Promise<boolean> {
  const currentPlatform = platform()

  switch (currentPlatform) {
    case 'win32': {
      return isProtocolRegisteredWindows(protocol)
    }
    case 'darwin': {
      return isProtocolRegisteredMacOS(protocol)
    }
    case 'linux': {
      return isProtocolRegisteredLinux(protocol)
    }
    default: {
      console.warn(`不支持的平台: ${currentPlatform}`)
      return false
    }
  }
}

/**
 * 检查协议是否已注册（Windows）
 * @param protocol - 要检查的协议名称
 * @returns Promise<boolean> - 协议是否已注册
 */
function isProtocolRegisteredWindows(protocol: string): Promise<boolean> {
  return new Promise(resolve => {
    exec(`reg query HKEY_CLASSES_ROOT\\${protocol}`, err => {
      resolve(!err) // 存在注册表项就是已注册
    })
  })
}

/**
 * 检查协议是否已注册（macOS）
 * @param protocol - 要检查的协议名称
 * @returns Promise<boolean> - 协议是否已注册
 */
function isProtocolRegisteredMacOS(protocol: string): Promise<boolean> {
  return new Promise(resolve => {
    // 使用 lsappinfo 命令检查协议处理程序
    exec(
      `/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump | grep -i "${protocol}:"`,
      (err, stdout) => {
        resolve(!err && stdout.trim().length > 0)
      }
    )
  })
}

/**
 * 检查协议是否已注册（Linux）
 * @param protocol - 要检查的协议名称
 * @returns Promise<boolean> - 协议是否已注册
 */
function isProtocolRegisteredLinux(protocol: string): Promise<boolean> {
  return new Promise(resolve => {
    // 检查 xdg-mime 是否存在协议处理程序
    exec(`xdg-mime query default x-scheme-handler/${protocol}`, (err, stdout) => {
      resolve(!err && stdout.trim().length > 0 && !stdout.includes('no default application'))
    })
  })
}

/**
 * 提取URL中的协议名称
 * @param url - 完整的URL
 * @returns string - 协议名称（不包含冒号）
 * @example
 * ```ts
 * const protocol = extractProtocol('mailto:user@example.com')
 * console.log(protocol) // 'mailto'
 * ```
 */
export function extractProtocol(url: string): string {
  const colonIndex = url.indexOf(':')
  return colonIndex > 0 ? url.slice(0, Math.max(0, colonIndex)) : ''
}

/**
 * 检查URL是否为HTTP/HTTPS协议
 * @param url - 要检查的URL
 * @returns boolean - 是否为HTTP/HTTPS协议
 * @example
 * ```ts
 * const isHttp = isHttpProtocol('https://example.com')
 * console.log(isHttp) // true
 *
 * const isNotHttp = isHttpProtocol('mailto:user@example.com')
 * console.log(isNotHttp) // false
 * ```
 */
export function isHttpProtocol(url: string): boolean {
  return url.startsWith('http://') || url.startsWith('https://')
}

/**
 * 检查URL是否为自定义协议（非HTTP/HTTPS）
 * @param url - 要检查的URL
 * @returns boolean - 是否为自定义协议
 * @example
 * ```ts
 * const isCustom = isCustomProtocol('mailto:user@example.com')
 * console.log(isCustom) // true
 *
 * const isNotCustom = isCustomProtocol('https://example.com')
 * console.log(isNotCustom) // false
 * ```
 */
export function isCustomProtocol(url: string): boolean {
  return !isHttpProtocol(url) && url.includes(':')
}
